package imageclipper

import (
	"log"
	"os"
)

var extensions = [1]string{"jpg"}
var tileWidth = 2448
var tileHeight = 2048

/*
瓦片化图像裁剪器入口
	1. 将已经是瓦片化的图片, 通过设置指定区域进行再分割的处理，形成新的瓦片化图片
	2. 新的瓦片化图像, 一定是小于原始瓦片化图像的, 并且每张图符合 2448 x 2048 大小规格
	例如：
		可以将 10 x 10 的图像，裁剪成 9 x 9 的图像
	3. 操作方法, 只需要指定左上角坐标以及目标图像大小即可
	params:
		file_path:     源图像文件夹
		tmp_path:      临时目录 (模块自动创建, 无需预先创建)
		x, y:          准备裁剪的左上角坐标
		width, height: 裁剪区域 (不能超过实际原图大小)
	returns:
		err: error
*/
func Run(file_path, tmp_path string, x, y, width, height int) (err error) {

	log.Println("准备进行图片裁剪")

	log.Println("检测指定路径下的图片文件扩展名")
	log.Println("图片目录:", file_path)
	extension, err := getSourceExtension(file_path)
	if err != nil {
		log.Println(err.Error())
		return
	}
	log.Println("扩展名:", extension)

	log.Println("验证每一个图片文件的 width height 是否一致")
	tileHeight, tileWidth, err = verfiySourceTileSize(file_path, extension)
	if err != nil {
		log.Println(err.Error())
		return err
	}

	log.Println("开始创建临时目录")
	if err := os.MkdirAll(tmp_path, 0755); err != nil {
		log.Println("创建临时文件夹失败")
		return err
	}

	log.Println("准备复制临时图片文件")
	if err := create_tmp_files(file_path, tmp_path, extension); err != nil {
		log.Println("生成临时文件异常")
		return err
	}

	log.Println("检测现有图片的 columns 和 rows")
	cols, rows, err := getSourceRect(tmp_path, extension)
	if err != nil {
		log.Println(err.Error())
		return
	}
	log.Println("cols:", cols)
	log.Println("rows:", rows)

	log.Println("开始验证参数")
	new_cols, new_rows, err := verifyParameter(x, y, width, height, cols, rows)
	if err != nil {
		log.Println(new_cols, new_rows, err.Error())
		return
	}
	log.Println("new cols:", new_cols)
	log.Println("new rows:", new_rows)

	log.Println("清理图片, 超区删除, 区内去边")
	if err := clear(tmp_path, extension, cols, rows, x, y, width, height); err != nil {
		return err
	}
	log.Println("清理完毕")

	log.Println("开始重排图片名称, 以 0_0 为起始进行重排")
	if err := renames(tmp_path, extension, cols, rows); err != nil {
		return err
	}

	if x > 0 || y > 0 {
		log.Println("开始调整图片大小, 每个图片 2448 x 2048 大小")
		if err := flush(tmp_path, extension, new_cols, new_rows); err != nil {
			return err
		}
	}

	log.Println("开始更新裁剪图片")
	if err := update_folder(file_path, tmp_path, extension); err != nil {
		return err
	}

	log.Println("完成裁剪")
	return nil
}
